home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
EFFECT.C
< prev
next >
Wrap
Text File
|
2000-03-25
|
2KB
|
109 lines
/*
#include <stdio.h>
void key_wait( void );
*/
#include "effect.h"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define EFFECT_MAX 32 /* エフェクト最大数 */
static EFFECT effect[EFFECT_MAX]; /* ワーク */
static EFFECT *effect_top, /* 使用中のワークのリスト */
*effect_null_top; /* 空のワークのリスト */
typedef void (*func_init) (struct _effect *);
func_init FuncInitEffect[]=
{
InitEffectExplL,
InitEffectExpl,
InitEffectExplMini,
InitEffectExplPlayer,
InitEffectHahen,
InitEffectHahenMini,
InitEffectTitSpark,
};
void InitEffect( void )
{
int i;
/* リストをつなげる */
effect_top = NULL;
effect_null_top = effect;
for (i = 0; i < EFFECT_MAX; i++)
effect[i].next = &effect[i + 1];
effect[EFFECT_MAX - 1].next = NULL;
}
/* エフェクト出現時に呼ばれる */
void MakeEffect(short type, short type2, short x, short y)
{
EFFECT *p;
if (effect_null_top == NULL)
return; /* 空きのワークがない(キャラクターオーバー) */
p = effect_null_top;
effect_null_top = p->next;
p->next = effect_top;
effect_top = p;
p->type = type;
p->type2 = type2;
p->x = x;
p->y = y;
FuncInitEffect[type] (p); /* 初期化ルーチンへ飛ぶ(関数へのポインタってヤツ) */
}
/* 垂直同期ごとに呼ばれる */
void MoveEffect( void )
{
EFFECT *p, *q;
p = effect_top; /* 現在注目しているワーク */
q = NULL; /* 1つ前のワーク(ワーク削除時に必要) */
while (p != NULL) {
/* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
if( !(p->func_effect_move) (p) ) { /* 返り値が0なら消去 */
if (q == NULL) { /* リストの一番最初を削除 */
effect_top = p->next;
p->next = effect_null_top;
effect_null_top = p;
q = NULL;
p = effect_top;
} else {
q->next = p->next;
p->next = effect_null_top;
effect_null_top = p;
p = q->next;
}
} else {
q = p;
p = p->next;
}
}
}
/* エフェクト消去時に呼ばれる(面クリア等) */
void EffectTini( void )
{
int i;
/* リストをつなげる */
effect_top = NULL;
effect_null_top = effect;
for (i = 0; i < EFFECT_MAX; i++)
effect[i].next = &effect[i + 1];
effect[EFFECT_MAX - 1].next = NULL;
}